JVM-Class-字节码学习笔记

目标使用javap直接阅读字节码

魔数

  • 开头前4个字节为 CAFE BABE,(两个十六进制字符为一个字节),后四个字节为Class 文件的版本号,先次版本号,后主版本号,能向下兼容,不能向后兼容,
  • 之后的两个字节为常量池常量的个数,从1开始计数,在之后就是每一个常量的信息,最多64
    k个
  • 常见的有 14 个
    • Class:tag(u1)+ name_index(u2)
    • Utf8:tag(u1)+ length(u2)+ bytes(length)方法名,字段名,加上包名不能超过64k
    • 基础数据类型,tag(u1)+ bytes(?)值
  • 访问标志,两个字节,为标志位,用于表示类的信息,比如是否是public,final,super,interface,abstract,enum,annotation
  • 类索引,父类索引,接口索引
  • 字段表,访问标志,public protected private 三选一,final volatile 不能同时选择,接口中public static final 是必须的。access_flags, name_index(简单名称),descriptor_index(全限定名),attributes_count,attributes
  • 方法表集合access_flags (strictfp,native,synchronized
  • 属性表集合
    • InnerClass
    • LineNumberTable 源码与字节码对应
    • LocalVariableTable
    • StackMapTable
    • Signature
    • SourceFile
    • Synthetic
      每个属性都引用常量池里来表示
      Code 属性,方法体的信息存储在这,code_length 长度固定